from django.db import models
from goods.models import Product
from sku.models import Sku
# Create your models here.

class Order(models.Model):
    delivery_time_list=[
        (0,'不限'),
        (1,'周一'),
        (2,'周二'),
        (3,'周三'),
        (4,'周四'),
        (5,'周五'),
        (6,'周六'),
        (7,'周日'),
    ]
    pay_status=[
        (1,'待支付'),
        (2,'待发货'),
        (3,'待收货'),
        (4,'待评价'),
        (5,'已完成'),
        (6,'已取消'),
    ]
    actual_payment=models.DecimalField(max_digits=10,decimal_places=2,verbose_name='实付金额')
    order_goods=models.ForeignKey(Product,on_delete=models.CASCADE,verbose_name='商品')
    created_time=models.DateTimeField(auto_now_add=True,verbose_name='下单时间')
    order_number=models.CharField(max_length=25,verbose_name='订单号')
    update_time=models.DateTimeField(auto_now=True,verbose_name='更新时间')
    order_of_payment=models.IntegerField(default=1,verbose_name='订单状态',choices=pay_status)
    address=models.ForeignKey('address.address',on_delete=models.CASCADE,verbose_name='收货地址')
    delivery_time=models.IntegerField(choices=delivery_time_list,verbose_name='指定送达时间',default=0,blank=True)
    delivery_company=models.CharField(max_length=20,null=True,verbose_name='物流公司')
    # 需要设置blank=True，因为前端可能不传备注，不设置的话，前端不传备注会报错
    remark=models.CharField(max_length=200,null=True,verbose_name='备注',blank=True)
    sku=models.ForeignKey('sku.Sku',on_delete=models.CASCADE,verbose_name='sku')
    user=models.ForeignKey('user.UserProfile',on_delete=models.CASCADE,verbose_name='用户')
    num=models.IntegerField(verbose_name='数量',default=1)
    freight=models.DecimalField(max_digits=10,decimal_places=2,verbose_name='运费',default=0)
    delivery_number = models.CharField(max_length=20, null=True, verbose_name='物流单号')
    parent_order = models.ForeignKey('self', on_delete=models.CASCADE, null=True, verbose_name='父订单')
    # ... 已有字段保持不变 ...
    transaction_id = models.CharField(max_length=32, null=True, verbose_name='微信支付单号')  # 新增交易单号字段
    pay_time = models.DateTimeField(null=True, verbose_name='支付时间')  # 新增支付时间字段

"""
    考虑到数据一致性和并发控制，使用预占记录是更可靠的做法。此外
    使用数据库事务和锁机制来确保操作的原子性也很重要，特别是在高并发场景下。
"""
class OrderStockLock(models.Model):
    """订单库存锁定记录"""
    # `models.PROTECT`的作用是，在试图删除被外键引用的对象时，
    # 阻止删除操作并引发ProtectedError异常。这样可以避免级联删除导致的数据丢失
    # 确保数据的完整性。例如，在订单库存锁定记录中，如果某个Sku被锁定，
    # 当尝试删除该Sku时，Django会阻止删除，直到所有关联的锁定记录被手动处理。
    sku = models.ForeignKey(Sku, on_delete=models.PROTECT, verbose_name="商品")
    order_no = models.CharField(max_length=40, verbose_name="订单号")
    quantity = models.PositiveIntegerField(verbose_name="锁定数量")
    locked_time = models.DateTimeField(auto_now_add=True, verbose_name="锁定时间")
    is_committed = models.BooleanField(default=False, verbose_name="已提交")

class physical_distribution_history(models.Model):
    """
        物流配送表
    """
    order = models.ForeignKey(Order, on_delete=models.CASCADE, verbose_name="所属订单")
    time=models.DateTimeField(auto_now_add=True, verbose_name="变化时间")
    text=models.CharField(max_length=200, verbose_name="变化内容")
    physical_distribution_state = models.IntegerField(default=1, verbose_name='物流配送状态', choices=[
        (1, '已下单'),
        (2, '已发货'),
        (3, '已揽件'),
        (4, '运输中'),
        (5, '派送中'),
        (6, '已签收'),
    ], null=True, blank=True)







